#! /usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui
import sys, os, sqlite3, todo
from elixir import *
from ventanaDevolucionUI import Ui_Form

class FormDevolucion(QtGui.QMainWindow):
    def __init__(self,parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_Form()
        self.center()
        self.ui.setupUi(self)

        self.ui.treeWidget.resizeColumnToContents(0)
        self.ui.treeWidget.resizeColumnToContents(1)
        self.ui.treeWidget.resizeColumnToContents(2)
        self.ui.treeWidget.resizeColumnToContents(3)
        self.ui.treeWidget.resizeColumnToContents(4)

    def center(self):
        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
        
    def cargaArticulos(self):
        self.ui.comboArticuloNuevo.clear()
        try:
            self.articulos = todo.Articulo.query.filter(todo.Articulo.stock>0).all()
            for articulo in self.articulos:
                self.ui.comboArticuloNuevo.insertItem(articulo.id, articulo.nombre)

            self.cantidadPrecio()

        except:
            pass

    def habilitaQuitar(self):
        if self.ui.treeWidget.topLevelItemCount() == 0:
            self.ui.pushButton_3.setEnabled(False)
            self.ui.pushVender.setEnabled(False)

        else:
            self.ui.pushButton_3.setEnabled(True)
            if int(self.ui.labelTotal.text()) >= 0:
                self.ui.spinPago.setMinimum(int(self.ui.labelTotal.text()))
                self.ui.pushVender.setEnabled(True)

    def bloquearEntrante(self):
        self.ui.spinCantidad.setEnabled(False)
        self.ui.spinPrecio.setEnabled(False)
        self.ui.pushAgregar.setEnabled(False)

    def bloquearSaliente(self):
        self.ui.spinCantidadNuevo.setEnabled(False)
        self.ui.spinPrecioNuevo.setEnabled(False)
        self.ui.pushAgregarNuevo.setEnabled(False)

    def habilitarEntrante(self):
        self.ui.spinCantidad.setEnabled(True)
        self.ui.spinPrecio.setEnabled(True)
        self.ui.pushAgregar.setEnabled(True)

    def habilitarSaliente(self):
        self.ui.spinCantidadNuevo.setEnabled(True)
        self.ui.spinPrecioNuevo.setEnabled(True)
        self.ui.pushAgregarNuevo.setEnabled(True)

    def cantidadPrecio(self):
        nombre = self.ui.comboArticuloNuevo.currentText()
        try:
            articulo = todo.Articulo.get_by(nombre=unicode(nombre))
            self.ui.spinCodigoNuevo.setValue(articulo.id)
            self.ui.spinCantidadNuevo.setMaximum(articulo.stock)
            self.ui.spinPrecioNuevo.setValue(articulo.precio)
            self.habilitarSaliente()

        except:
            self.bloquearSaliente()

    def cantidadPrecio2(self):
        if len(self.articulos) > 0:
            codigo = self.ui.spinCodigoNuevo.value()
            articulo = todo.Articulo.get(codigo)
            if articulo in self.articulos:
                indice = self.ui.comboArticuloNuevo.findText(str(articulo.nombre), QtCore.Qt.MatchWildcard)
                self.ui.comboArticuloNuevo.setCurrentIndex(indice)
                self.ui.spinCantidadNuevo.setMaximum(articulo.stock)
                self.ui.spinPrecioNuevo.setValue(articulo.precio)
                self.habilitarSaliente()

            else:
                self.cargaArticulos()

        else:
            self.ui.spinCodigoNuevo.setValue(0)
            self.bloquearSaliente()

    def cantidadPrecio3(self):
        nombre = self.ui.comboArticulo.currentText()
        try:
            articulo = todo.Articulo.get_by(nombre=unicode(nombre))
            detalle = todo.DetalleVenta.get_by(articulo=articulo,venta=self.venta)
            self.ui.spinCantidad.setMaximum(detalle.cantidad)
            self.ui.spinCodigo.setValue(detalle.articulo.id)
            self.ui.spinPrecio.setValue(detalle.precio)
            self.habilitarEntrante()

        except:
            self.bloquearEntrante()

    def cantidadPrecio4(self):
        if len(self.detalles) > 0:
            codigo = self.ui.spinCodigo.value()
            articulo = todo.Articulo.get(codigo)
            detalle = todo.DetalleVenta.get_by(articulo=articulo)
            if detalle in self.detalles:
                indice = self.ui.comboArticulo.findText(str(detalle.articulo.nombre), QtCore.Qt.MatchWildcard)
                self.ui.comboArticulo.setCurrentIndex(indice)
                self.ui.spinCantidad.setMaximum(detalle.cantidad)
                self.ui.spinPrecio.setValue(detalle.precio)
                self.habilitarEntrante()

            else:
                self.cargaArticulos2()

        else:
            self.ui.spinCodigo.setValue(0)
            self.bloquearEntrante()

    def agregar(self):
        codigo = self.ui.spinCodigo.value()
        nombre = self.ui.comboArticulo.itemText(self.ui.comboArticulo.currentIndex())
        cantidad = self.ui.spinCantidad.value()
        precio = self.ui.spinPrecio.value() * -1
        items = self.ui.treeWidget.findItems(nombre, QtCore.Qt.MatchWildcard, 1)
        if len(items) > 0:
            i = 0
            for item in items:
                if int(item.text(0)) == codigo and int(item.text(3)) < 0:
                    item.setText(2, str(int(item.text(2)) + cantidad))
                    item.setText(4, str(int(item.text(2)) * self.ui.spinPrecio.value() * -1))
                    i += 1

            if i == 0:
                item=QtGui.QTreeWidgetItem([str(codigo), nombre, str(cantidad), str(precio), str(precio*cantidad)])
                item.setTextAlignment(0, 2)
                item.setTextAlignment(2, 2)
                item.setTextAlignment(3, 2)
                item.setTextAlignment(4, 2)
                self.ui.treeWidget.addTopLevelItem(item)

        else:
            item = QtGui.QTreeWidgetItem([str(codigo), nombre, str(cantidad), str(precio), str(precio*cantidad)])
            item.setTextAlignment(0, 2)
            item.setTextAlignment(2, 2)
            item.setTextAlignment(3, 2)
            item.setTextAlignment(4, 2)
            self.ui.treeWidget.addTopLevelItem(item)
        
        self.ui.labelTotal.setText(str(int(self.ui.labelTotal.text()) + (precio * cantidad)))
        articulo = todo.Articulo.get(codigo)
        articulo.stock += cantidad

        for detalle in self.detalles:
            if detalle.articulo.id == codigo:
                detalle.cantidad -= cantidad

        self.venta.total += (cantidad * precio)
        
        self.ui.spinCantidad.setValue(1)
        self.habilitaQuitar()
        self.cargaArticulos()
        self.cargaArticulos2()

    def agregarNuevo(self):
        codigo = self.ui.spinCodigoNuevo.value()
        nombre = self.ui.comboArticuloNuevo.itemText(self.ui.comboArticuloNuevo.currentIndex())
        cantidad = self.ui.spinCantidadNuevo.value()
        precio = self.ui.spinPrecioNuevo.value()
        items = self.ui.treeWidget.findItems(nombre, QtCore.Qt.MatchWildcard, 1)
        if len(items) > 0:
            i = 0
            for item in items:
                if int(item.text(0)) == codigo and int(item.text(3)) > 0:
                    item.setText(2, str(int(item.text(2)) + cantidad))
                    item.setText(4, str(int(item.text(2)) * self.ui.spinPrecioNuevo.value()))
                    i += 1

            if i == 0:
                item=QtGui.QTreeWidgetItem([str(codigo), nombre, str(cantidad), str(precio), str(precio*cantidad)])
                item.setTextAlignment(0, 2)
                item.setTextAlignment(2, 2)
                item.setTextAlignment(3, 2)
                item.setTextAlignment(4, 2)
                self.ui.treeWidget.addTopLevelItem(item)

        else:
            item=QtGui.QTreeWidgetItem([str(codigo), nombre, str(cantidad), str(precio), str(precio*cantidad)])
            item.setTextAlignment(0, 2)
            item.setTextAlignment(2, 2)
            item.setTextAlignment(3, 2)
            item.setTextAlignment(4, 2)
            self.ui.treeWidget.addTopLevelItem(item)
        
        self.ui.labelTotal.setText(str(int(self.ui.labelTotal.text()) + (precio * cantidad)))
        articulo = todo.Articulo.get(codigo)
        articulo.stock -= cantidad
        self.ui.spinCantidadNuevo.setValue(1)
        self.habilitaQuitar()
        self.cargaArticulos()

    def vuelto(self):
        self.ui.labelVuelto.setText(str(self.ui.spinPago.value() - int(self.ui.labelTotal.text())))

    def vender(self):
        venta = todo.Venta(forma_pago=unicode(self.ui.comboForma.currentText()), 
            pago=self.ui.spinPago.value(), total=int(self.ui.labelTotal.text()), 
            vendedor=self.vendedor, vuelto=int(self.ui.labelVuelto.text()))

        for item in self.ui.treeWidget.findItems("*", QtCore.Qt.MatchWildcard, 0):
            for articulo in self.articulos:
                if articulo.id == int(item.text(0)):
                    todo.DetalleVenta(articulo=articulo, 
                        cantidad=int(item.text(2)), precio=int(item.text(3)), 
                        venta=venta, subtotal=(int(item.text(2))*int(item.text(3))))

        session.commit()
        self.limpiar()

    def eliminar(self):
        item = self.ui.treeWidget.currentItem()
        articulo = todo.Articulo.get(int(item.text(0)))
        if int(item.text(3)) < 0:
            detalle = todo.DetalleVenta.get_by(articulo=articulo,venta=self.venta)
            detalle.cantidad += int(item.text(2))
            articulo.stock -= int(item.text(2))
            self.venta.total -= (int(item.text(2)) * int(item.text(3)))

        else:
            articulo.stock += int(item.text(2))

        index = self.ui.treeWidget.indexOfTopLevelItem(item)
        self.ui.treeWidget.takeTopLevelItem(int(index))
        total = int(self.ui.labelTotal.text()) - int(item.text(4))
        self.ui.labelTotal.setText(str(total))
        self.ui.spinPago.setMinimum(total)
        self.ui.spinPago.setValue(total)
        self.cargaArticulos()
        self.cargaArticulos2()
        self.habilitaQuitar()

    def limpiar(self):
        QtGui.QMessageBox.warning(self, 'Mensaje', "Venta realizada con exito")
        self.ui.treeWidget.clear()
        self.ui.labelTotal.setText("0")
        self.ui.spinPago.setMinimum(0)
        self.ui.spinPago.setValue(0)
        self.ui.labelVuelto.setText("0")

    def setVendedor(self, vendedor):
        self.vendedor = vendedor

    def cargaProductos(self):
        try:
            codigo = self.ui.spinVenta.value()
            self.venta = todo.Venta.get(codigo)
            self.cargaArticulos2()
            self.cargaArticulos()

        except:
            QtGui.QMessageBox.warning(self, 'Mensaje', "El codigo ingresado no existe")

    def cargaArticulos2(self):
        self.ui.comboArticulo.clear()
        try:
            query = todo.DetalleVenta.query.filter_by(venta=self.venta)
            self.detalles = query.filter(todo.DetalleVenta.cantidad>0).all()
            for detalle in self.detalles:
                self.ui.comboArticulo.insertItem(detalle.articulo.id, detalle.articulo.nombre)

            self.habilitar()
            self.cantidadPrecio3()

        except:
            pass
        
    def habilitar(self):
        self.ui.spinCodigo.setEnabled(True)
        self.ui.comboArticulo.setEnabled(True)
        self.ui.spinCantidad.setEnabled(True)
        self.ui.spinPrecio.setEnabled(True)
        self.ui.pushAgregar.setEnabled(True)
        self.ui.spinCodigoNuevo.setEnabled(True)
        self.ui.comboArticuloNuevo.setEnabled(True)
        self.ui.spinCantidadNuevo.setEnabled(True)
        self.ui.spinPrecioNuevo.setEnabled(True)
        self.ui.pushAgregarNuevo.setEnabled(True)
        self.ui.comboForma.setEnabled(True)
        self.ui.spinPago.setEnabled(True)

if __name__ == '__main__':
    todo.initDB()
    app = QtGui.QApplication(sys.argv)
    myapp = FormNuevaVenta()
    myapp.show()
    sys.exit(app.exec_())